package roborallyimplementation;
import be.kuleuven.cs.som.annotate.*;

/**
 * Een klasse van exceptions veroorzaakt door het voorkomen van een onaanvaardbare positie van een robot.
 * 		Elk van deze exceptions draagt de coördinaten met zich mee.
 * 
 * @author	Thomas Vochten (1ba inform) en Daan Daele (1ba inform)
 * @version	1.0
 *
 */
public class IllegalPositionException extends IllegalArgumentException {
	
	/**
	 * 
	 */
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * Initialiseert de exception met een robot, een foutenboodschap, een x-coördinaat en een y-coördinaat.
	 * 
	 * @param	robot
	 * 			De robot die meegegeven wordt met deze exception.
	 * @param	message
	 * 			De foutenboodschap die de exception met zich mee zal dragen.
	 * @param	xcoord
	 * 			De horizontale coördinaat betrokken bij de situatie waarin de exception gegooid werd.
	 * @param	ycoord
	 * 			De verticale coördinaat betrokken bij de situatie waarin de exception gegooid werd.
	 * @post	De exception zal de meegegeven robot als robot hebben.
	 * 			|	this.getRobot() == robot
	 * @post	De exception zal de meegegeven foutenboodschap als foutenboodschap hebben.
	 * 			|	this.getMessage == message
	 * @post	De exception zal de meegegeven horizontale coördinaat als horizontale coördinaat hebben.
	 * 			|	this.getXCoordinate() == xcoord
	 * @post	De exception zal de meegegeven verticale coördinaat als verticale coördinaat hebben.
	 * 			|	this.getYCoordinate() == ycoord
	 */
	@Raw
	public IllegalPositionException(Robot robot, String message, long xcoord, long ycoord)
	{
		this.robot = robot;
		this.message = message;
		this.xcoord = xcoord;
		this.ycoord = ycoord;
	}
	
	/**
	 * Initialiseert de exception met een lege verwijzing naar een robot, een foutenboodschap, een x-coördinaat en een y-coördinaat.
	 * 
	 * @param	message
	 * 			De foutenboodschap die de exception met zich mee zal dragen.	 *
	 * @param	xcoord
	 * 			De horizontale coördinaat betrokken bij de situatie waarin de exception gegooid werd.	 
	 * @param	ycoord
	 * 			De verticale coördinaat betrokken bij de situatie waarin de exception gegooid werd.
	 * @effect	De exception wordt geïnitialiseerd met een nullverwijzing naar een robot, de gegeven horizontale coördinaat en de gegeven verticale coördinaat.
	 */
	@Raw
	public IllegalPositionException(String message, long xcoord, long ycoord)
	{
		this(null, message, xcoord, ycoord);
	}
	
	/**
	 * Initialiseert de exception met een robot, een foutenboodschap en een coördinatenrij.
	 * 
	 * @param	robot
	 * 			De robot die meegegeven wordt met deze exception.
	 * @param	message
	 * 			De foutenboodschap die de exception met zich mee zal dragen.
	 * @param	coords
	 * 			De coördinatenrij die de exception toegewezen zal krijgen.
	 * @effect	De exception wordt geïnitialiseerd met de gegeven robot als robot, de gegeven boodschap als boodschap, het eerste element in de rij
	 * 			als horizontale coördinaat en het tweede element in de rij als verticale coördinaat.
	 */
	@Raw
	public IllegalPositionException(Robot robot, String message, long[] coords)
	{
		this.robot = robot;
		this.message = message;
		this.xcoord = coords[0];
		this.ycoord = coords[1];
	}
	
	/**
	 * Initialiseert de exception met een lege verwijzing naar een robot, een foutenboodschap en een coördinatenrij.
	 * 
	 * @param	message
	 * 			De foutenboodschap die de exception met zich mee zal dragen.
	 * @param	coords
	 * 			De coördinatenrij die de exception toegezen zal krijgen.
	 * @effect	De exception wordt geïnitialiseerd met een nullverwijzing naar een robot, de gegeven boodschap als boodschap, het eerste element in de rij
	 * 			als horizontale coördinaat en het tweede element in de rij als verticale coördinaat.
	 */
	@Raw
	public IllegalPositionException(String message, long[] coords)
	{
		this(null, message, coords);
	}
	
	/**
	 * Geeft de robot terug.
	 */
	@Basic @Raw @Immutable
	public Robot getRobot()
	{
		return robot;
	}
	
	private Robot robot;
	
	/**
	 * Geeft de x-coördinaat terug.
	 */
	@Basic @Raw @Immutable
	public long getXCoordinate()
	{
		return xcoord;
	}
	
	/**
	 * Geeft de y-coördinaat terug.
	 */
	@Basic @Raw @Immutable
	public long getYCoordinate()
	{
		return ycoord;
	}
	
	/**
	 * Geeft de coördinaten terug onder de vorm van een array van type long.
	 */
	@Basic @Raw @Immutable
	public long[] getCoordinates()
	{
		long[] coords = {getXCoordinate(), getYCoordinate()};
		return coords;
	}
	
	private long xcoord;
	private long ycoord;
	
	/**
	 * Geeft de foutenboodschap terug.
	 */
	@Basic @Raw @Immutable
	public String getErrorMessage()
	{
		return message;
	}
	
	private String message;
}
